'''
使用单例模式：让一个类只有一个实例化对象
在UI自动化中解决，打开多个浏览器的问题
'''
from selenium import webdriver
from utils.config import host_port
import time


class GetFact:
    # 定义一个静态属性，保存生成的浏览器对象
    driver = None

    @classmethod
    def getDriver(cls, browser_type='Chrome'):
        # 判断driver是否为None，如果是None，则需要打开一个浏览器，将打开的浏览器赋值给静态属性driver
        if cls.driver is None:
            if browser_type == 'Chrome':
                chrome_options = webdriver.ChromeOptions()
                # 取消浏览器自动保存用户名密码的弹窗
                prefs = {"credentials_enable_service": False,
                         "profile.password_manager_enabled": False
                         }
                chrome_options.add_experimental_option("prefs", prefs)
                # 让浏览器不显示“Chrome正受到自动测试软件的控制”
                chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
                cls.driver = webdriver.Chrome(options=chrome_options)
                # 调用登录
                GetFact.login()
            elif browser_type == 'Firefox':
                cls.driver = webdriver.Firefox()
            elif browser_type == 'Edge':
                cls.driver = webdriver.Edge()
            else:
                print('浏览器类型不支持')

        # 浏览器最大化
        cls.driver.maximize_window()
        # 隐式等待
        cls.driver.implicitly_wait(10)



        return cls.driver

    # 登录
    @classmethod
    def login(cls):
        # 打开网页
        cls.driver.get(f"https://{host_port}/login")

        time.sleep(1)

        # 输入用户名
        cls.driver.find_element_by_css_selector('input[type="text"]').send_keys("admin")
        # 输入密码
        cls.driver.find_element_by_css_selector('input[type="password"]').send_keys("admin")
        # 点击登录
        cls.driver.find_element_by_css_selector('button[type="button"]').click()


# main方法里可以进行测试
if __name__ == '__main__':
    GetFact.getDriver()
